#!/usr/bin/env python
# -*-coding: utf-8 -*-
# Filename: crear_grupo.py

##
# Módulos del sistema
# Parte gráfica
try:
    import pygtk
    pygtk.require("2.0")
    import gtk
    import gtk.glade
except ImportError, error:
    print error
    print "Necesitas la librería gráficas gtk+pygtk"

#Utilidades
from datetime import datetime

##
# Módulos propios
try:
    from lib.funciones_utiles import close, add_find_column
    from lib.database import Empleado, GrupoDeResolucion, Usuario
    from gui.msj_retroalimentacion import MensajeDeError, MensajeDeAdvertencia
    from gui.msj_retroalimentacion import MensajeDeNotificacion
except ImportError, error:
    print error
    print "Error en gerencia.py"

class CrearGrupoDeResolucion:
    def __init__(self, padre):
        self.gladefile = "gui/ghhp.glade"
        self.padre = padre
        self.wTree = gtk.glade.XML(self.gladefile, "CrearGrupoDeResolucion")
        self.window = self.wTree.get_widget("CrearGrupoDeResolucion")
        self.window.resize(650, 400)
        self.un_dict = {"on_button32_clicked": self.agregar_integrante,
                "on_button33_clicked": self.quitar_integrante,
                "on_button26_clicked": self.close,
                "on_button25_clicked": self.registrar_grupo,
                "on_cancelbutton9_clicked": self.confirmar_registro,
                "on_okbutton10_clicked": self.close}
        self.wTree.signal_autoconnect(self.un_dict)
        #Variables de instancia
        self.hbox_52 = self.wTree.get_widget("hbox52")
        self.vbox_13 = self.wTree.get_widget("vbox13")
        self.tree_empleados = self.wTree.get_widget("treeview9")
        self.lista_empleados = gtk.ListStore(str, str, str)
        self.tree_empleados.set_model(self.lista_empleados)
        self.tree_integrantes = self.wTree.get_widget("treeview11")
        self.lista_integrantes = gtk.ListStore(str, str, str)
        self.tree_integrantes.set_model(self.lista_integrantes)
        self.tree_integrantes_confirmacion = self.wTree.get_widget("treeview19")
        self.lista_confirmacion = gtk.ListStore(str, str, str)
        self.tree_integrantes_confirmacion.set_model(self.lista_integrantes)
        self.tree_grupos_activos = self.wTree.get_widget("treeview25")
        self.lista_grupos = gtk.ListStore(str,str)
        self.tree_grupos_activos.set_model(self.lista_grupos)
        self.crear_lista_resultados()
        self.codigo = ''
        self.nombre = ''
        self.empleados = []
        self.integrantes = []
        self.nombre_grupos = []
        self.codigo_grupos = []
        self.iterador_empleado = {}
        self.iterador_integrante = {}
        self.completar_listas()

    def crear_lista_resultados(self):
        """Establece las cabeceras de los treeview"""
        # Cabeceras Empleado y Usuario iguales
        titulos = ("Legajo", "Apellido", "Nombre")
        lista_tree = [self.tree_empleados, self.tree_integrantes,
                self.tree_integrantes_confirmacion]
        for tree in lista_tree:
            for pos, titulo in enumerate(titulos):
                add_find_column(titulo, pos, tree)
        # Cabecera grupos
        titulos = ("Codigo","Nombre")
        for pos, titulo in enumerate(titulos):
            add_find_column(titulo, pos, self.tree_grupos_activos)

    def completar_listas(self):
        #Grupos
        grupos = GrupoDeResolucion.select()
        for grupo in grupos:
            self.lista_grupos.append([grupo.id, grupo.nombre])
            self.nombre_grupos.append(grupo.nombre.lower())
            self.codigo_grupos.append(grupo.id)#!!!FIXME
        #Empleados: debemos poner los empleados que no TENGAN un usuario aun.
        empleados = Empleado.selectBy(usuarioID=None)
        for empleado in empleados:
            self.iterador_empleado[empleado.legajo]=self.lista_empleados.append(
                    [empleado.legajo, empleado.apellido, empleado.nombre])
            self.empleados.append(empleado)

    def agregar_integrante(self, widget):
        print "Agregar integrante"
        pos, seleccionado = self.integrante_seleccionado(1)
        if seleccionado:
            # Lo pasamos al de abajo y eliminamos uno arriba
            self.integrantes.append(self.empleados[pos])
            self.iterador_integrante[self.empleados[pos].legajo]= (
                    self.lista_integrantes.append(
                        [self.empleados[pos].legajo,
                        self.empleados[pos].apellido,
                        self.empleados[pos].nombre]))
            self.lista_empleados.remove(self.iterador_empleado[self.empleados[pos].legajo])
            self.empleados.remove(self.empleados[pos])
            self.rearmar_empleados()
        else:
            texto = "Debe seleccionar el Empleado que quiere tener como integrante."
            msj = MensajeDeError(texto, self.window)
            msj.run()

    def rearmar_empleados(self):
        self.iterador_empleado = {}
        self.lista_empleados.clear()
        for empleado in self.empleados:
            self.iterador_empleado[empleado.legajo]= self.lista_empleados.append(
                    [empleado.legajo, empleado.apellido, empleado.nombre])


    def integrante_seleccionado(self, tree):
        """Permite comprobar si selecciono un integrante de la lista pasada."""
        dic = {1: self.tree_empleados,
                2: self.tree_integrantes}
        model, path = dic[tree].get_selection().get_selected_rows()
        if path:
            pos, = path[0]
            return pos, True
        else:
            return "", False

    def quitar_integrante(self, widget):
        print "Quitamos integrante"
        pos, seleccionado = self.integrante_seleccionado(2)
        if seleccionado:
            # Lo pasamos al de arriba y eliminamos uno abajo
            self.empleados.append(self.integrantes[pos])
            self.iterador_empleado[self.integrantes[pos].legajo]= (
                    self.lista_empleados.append(
                        [self.integrantes[pos].legajo,
                        self.integrantes[pos].apellido,
                        self.integrantes[pos].nombre]))
            self.lista_integrantes.remove(self.iterador_integrante[self.integrantes[pos].legajo])
            self.integrantes.remove(self.integrantes[pos])
            self.rearmar_integrantes()
        else:
            texto = "Debe seleccionar el Empleado que quiere tener como integrante."
            msj = MensajeDeError(texto, self.window)
            msj.run()
    
    def rearmar_integrantes(self):
        self.iterador_integrante = {}
        self.lista_integrantes.clear()
        for integrante in self.integrantes:
            self.iterador_integrante[integrante.legajo]= self.lista_integrantes.append(
                    [integrante.legajo, integrante.apellido, integrante.nombre])
        
    def confirmar_registro(self, widget):
        """Llama a datos_validos y obtiene el nombre y el codigo del grupo."""
        self.codigo, self.nombre, bandera = self.datos_validos()
        if bandera:
            self.wTree.get_widget("label215").set_text(str(self.codigo))
            self.wTree.get_widget("label216").set_text(self.nombre)
            for integrante in self.integrantes:
                self.lista_confirmacion.append([integrante.legajo,
                    integrante.apellido,
                    integrante.nombre])
            self.hbox_52.hide()
            self.wTree.get_widget("dialog-action_area11").hide()
            self.vbox_13.show()
            self.window.resize(450, 250)

    def datos_validos(self):
        codigo = int(self.wTree.get_widget("entry53").get_text())
        nombre = self.wTree.get_widget("entry54").get_text()

        if codigo and nombre:
            #Preguntamos si no existen
            if (codigo in self.codigo_grupos and
                    nombre in self.nombre_grupos):
                error = ["Nombre y Código no pueden tener valoras identicos",
                        "a un grupo existente en el sistema"]
                msj = MensajeDeError("\n".join(error), self.window)
                msj.run()
                self.wTree.get_widget("entry53").set_text('')
                self.wTree.get_widget("entry54").set_text('')
                return '', '', False
            elif codigo in self.codigo_grupos:
                error = ["El código le pertenece a un grupo ya existente.",
                        "Por favor ingrese un valor distinto."]
                msj = MensajeDeError("\n".join(error), self.window)
                msj.run()
                self.wTree.get_widget("entry53").set_text('')
                return '', '', False
            elif nombre in self.nombre_grupos:
                error = ["El nombre le pertenece a un grupo ya existente.",
                        "Por favor ingrese un valor distinto."]
                msj = MensajeDeError("\n".join(error), self.window)
                msj.run()
                self.wTree.get_widget("entry54").set_text('')
                return '', '', False
            else:
                return codigo, nombre, True
        else:
            error = ["Los siguientes campos no pueden ser nulos",
                    "\t-Codigo",
                    "\t-Nombre"]
            msj = MensajeDeError("\n".join(error), self.window)
            msj.run()
            return '', '', False

    def close(self, widget):
        close(self.window)

    def registrar_grupo(self, widget):
        #Registramos el Grupo y mostramos un msj de Notificacion
        #!!! FIXME:falta registrar el codigo, ver el esquema da la BD
        descripcion = 'Te la encargo'
        self.padre.gerencia.crear_grupo_de_resolucion(datetime.now(),
                descripcion,
                self.integrantes,
                self.nombre)
        texto = "Grupo de Resolucion creado con exito"
        msj = MensajeDeNotificacion(texto, self.window)
        if msj.msj.run() == gtk.RESPONSE_OK:
            msj.msj.destroy()
            self.window.destroy()





